package com.yumingjiang.common.interceptor;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import com.yumingjiang.common.annotation.Auth;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 检查handler是否是带有@Auth注解的方法
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Auth authAnnotation = handlerMethod.getMethodAnnotation(Auth.class);
            if (authAnnotation != null) {
                // 从请求中获取名为AJTOKEN的Cookie
                Cookie[] cookies = request.getCookies();
                if (cookies != null) {
                    for (Cookie cookie : cookies) {
                        if ("AJ-TOKEN".equals(cookie.getName())) {
                            String token = cookie.getValue();
                            // 在这里添加你的鉴权逻辑，比如校验token的有效性
                            // 如果token有效，返回true继续处理请求；否则返回false阻止请求
                            if (isValidToken(token)) {
                                return true;
                            } else {
                                response.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid token");
                                return false;
                            }
                        }
                    }
                }
                // 如果没有找到AJTOKEN或token无效，阻止请求
                response.sendError(HttpServletResponse.SC_FORBIDDEN, "Token not found or invalid");
                return false;
            }
        }
        // 如果没有@Auth注解，继续处理请求
        return true;
    }

    // 这是一个假设的方法，你需要根据你的业务逻辑来实现token的校验
    private boolean isValidToken(String token) {
        // 在这里添加你的token校验逻辑
        // 例如，你可以查询数据库或调用一个服务来验证token的有效性
        // 这里只是返回一个固定的true作为示例
        return "AUTHPASS".equals(token);
    }
}